/**
 * macro 宏是rust中的重要内容
 * 这里涉及到宏的几个部分：
 * 1.宏的定义和作用
 * 2.宏和函数区别
 * 3.使用 macro_rules! 的声明宏用于通用元编程
 *    声明宏允许我们编写一些类似 Rust match 表达式的代码
 *    宏也将一个值和包含相关代码的模式进行比较；
 *    此种情况下，该值是传递给宏的 Rust 源代码字面值，模式用于和前面提到的源代码字面值进行比较，每个模式的相关代码会替换传递给宏的代码
 *     
 * 4.用于从属性生成代码的过程宏
 * 5.如何编写自定义 derive 宏
 * 6.类属性宏
 * 7.类函数宏
 * 以上是书本介绍的内容。
 * 
 * 而对于初学者而言，总结起来其实就是要掌握以下基本的内容：
 * 1.宏的定义和作用
 * 2.宏的原理
 * 3.宏和函数区别
 * 4.有什么系统宏，有什么作用。以及系统宏的分类。有必要给给脑图
 * 5.自定义宏的编写
 * 6.宏的调试技巧
 * 7.宏的优点和缺点
 */

/**
 * 1.申明式宏例子
 * 申明式宏以macro_rules! 关键字定义，用于在编译时进行代码的替换和生成。
 * 后面跟上宏名称。内容可以包含多个模式匹配表达式，和表达式相对应的替换代码（或者称为生成段)
 * 不同的匹配表达式之间使用分号进行分割.
 * 而模式匹配表达式式一种类似于正则表达式的rust定义规则表达式
 */
macro_rules! example {
    // 1. 简单固定匹配，不需要 $
    () => {
        println!("Empty match!");
    };

    // 2. 固定字面量匹配，不需要 $
    (hello) => {
        println!("Hello match!");
    };

    // 3. 使用元变量的匹配，需要 $
    ($x:expr) => {
        println!("Expression: {}", $x);
    };

    // 4. 混合使用
    (print $x:expr) => {
        println!("Printing: {}", $x);
    };

    // 5. 重复模式，需要 $
    (sum $($x:expr),*) => {
        {
            let mut total = 0;
            $(
                total += $x;
            )*
            total
        }
    };
}



fn main() {
    example!();           // 匹配第1个规则
    example!(hello);      // 匹配第2个规则
    example!(42);         // 匹配第3个规则
    example!(print 42);   // 匹配第4个规则
    let sum = example!(sum 1, 2, 3);  // 匹配第5个规则
    println!("Sum: {}", sum);
}
